package ar.uba.fi.taller2.cmmiassistant.frontend.instancia;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import ar.uba.fi.taller2.cmmiassistant.controlador.Operacion;
import ar.uba.fi.taller2.cmmiassistant.controlador.Transicion;
import ar.uba.fi.taller2.cmmiassistant.frontend.PanelVista;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Evaluacion;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Instancia;
import ar.uba.fi.taller2.cmmiassistant.vista.Estado;
import ar.uba.fi.taller2.cmmiassistant.vista.Vista;

public class EditandoInstancia extends PanelVista {

    private static final long serialVersionUID = -4485868985346956577L;
    private JPanel panelCampos;
    private JTextField textFieldIdInstancia;
    private JTextField textFieldNombre;
    private JTextArea textAreaDescripcion;
    private JPanel panelBotones;
    private JButton buttonGuardar;
    private JButton buttonCancelar;
    private ActionListener listenerButtonGuardar = new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            Map<String, Object> valores = new HashMap<String, Object>();
            valores.put("idInstancia", getTextFieldIdInstancia().getText());
            valores.put("nombre", getTextFieldNombre().getText());
            valores.put("descripcion", getTextAreaDescripcion().getText());
            Operacion operacion = getControlador().guardarInstancia(valores);
            getControlador().ejecutar(
                    new Transicion(EditandoInstancia.this,
                            getVista(Estado.MOSTRANDO_INSTANCIA), operacion));
        }
    };

    private ActionListener listenerCancelar = new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            if (getModelo().getInstanciaSeleccionada().isActiva()) {

                getControlador().ejecutar(
                        new Transicion(EditandoInstancia.this,
                                getVista(Estado.MOSTRANDO_INSTANCIA)));
            } else {

                getControlador().ejecutar(
                        new Transicion(EditandoInstancia.this,
                                getVista(Estado.MOSTRANDO_EVALUACION)));
            }
        }
    };

    public EditandoInstancia(Vista contexto) {
        super(contexto);

        this.initialize();
    }

    private void initialize() {

        this.setLayout(new BorderLayout());

        this.add(this.crearLabelTitulo("Instancia"), BorderLayout.NORTH);
        this.add(this.getPanelCampos(), BorderLayout.CENTER);
        this.add(this.getPanelBotones(), BorderLayout.SOUTH);
    }

    private JPanel getPanelBotones() {

        if (this.panelBotones == null) {

            this.panelBotones = new JPanel();
            this.panelBotones.setLayout(new GridBagLayout());
            this.panelBotones.setSize(new Dimension(0, 30));

            GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
            gridBagConstraints1.gridx = 1;
            gridBagConstraints1.gridy = 0;
            GridBagConstraints gridBagConstraints = new GridBagConstraints();
            gridBagConstraints.gridx = 0;
            gridBagConstraints.gridy = 0;

            this.panelBotones.add(this.getButtonGuardar(), gridBagConstraints);
            this.panelBotones
                    .add(this.getButtonCancelar(), gridBagConstraints1);
        }

        return this.panelBotones;
    }

    private JButton getButtonGuardar() {
        if (buttonGuardar == null) {
            buttonGuardar = new JButton();
            buttonGuardar.setText("Guardar");
            buttonGuardar.addActionListener(this.listenerButtonGuardar);
        }
        return buttonGuardar;
    }

    private JButton getButtonCancelar() {
        if (this.buttonCancelar == null) {
            this.buttonCancelar = new JButton();
            this.buttonCancelar.setText("Cancelar");
            this.buttonCancelar.addActionListener(this.listenerCancelar);
        }
        return this.buttonCancelar;
    }

    private JPanel getPanelCampos() {

        if (this.panelCampos == null) {

            this.panelCampos = new JPanel();
            this.panelCampos.setLayout(new GridBagLayout());
            this.panelCampos.add(this.crearLabelCampo("id"), this
                    .getDefaultLabelConstraints(1));
            this.panelCampos.add(this.getTextFieldIdInstancia(), this
                    .getDefaultFieldConstraints(1));
            this.panelCampos.add(this.crearLabelCampo("nombre"), this
                    .getDefaultLabelConstraints(2));
            this.panelCampos.add(this.getTextFieldNombre(), this
                    .getDefaultFieldConstraints(2));
            this.panelCampos.add(this.crearLabelCampo("descripcion"), this
                    .getDefaultLabelConstraints(3));
            this.panelCampos.add(this.getTextAreaDescripcion(), this
                    .getDefaultTextAreaConstraints(3));

            this.addCompletePanel(this.panelCampos);
        }

        return this.panelCampos;
    }

    private JTextArea getTextAreaDescripcion() {

        if (this.textAreaDescripcion == null) {

            this.textAreaDescripcion = this.crearTextArea();
        }

        return this.textAreaDescripcion;
    }

    private JTextField getTextFieldNombre() {

        if (this.textFieldNombre == null) {

            this.textFieldNombre = new JTextField();
        }

        return this.textFieldNombre;
    }

    private JTextField getTextFieldIdInstancia() {

        if (this.textFieldIdInstancia == null) {

            this.textFieldIdInstancia = new JTextField();
            this.textFieldIdInstancia.setEditable(false);
        }

        return this.textFieldIdInstancia;
    }

    public Estado getEstado() {

        return Estado.EDITANDO_INSTANCIA;
    }

    private void limpiar() {

        this.limpiar(this.getTextFieldIdInstancia(), this.getTextFieldNombre());
        this.limpiar(this.getTextAreaDescripcion());
    }

    public void activar() {

        this.limpiar();

        Instancia instancia = this.getModelo().getInstanciaSeleccionada()
                .getValor();

        if (instancia != null) {

            this.setText(this.getTextFieldIdInstancia(), instancia
                    .getIdInstancia());
            this.setText(this.getTextFieldNombre(), instancia.getNombre());
            this.setText(this.getTextAreaDescripcion(), instancia.getDescripcion());
        }

        super.activar();
    }

}
